

//api 接口
import api from '@/api/order.js'
	export default {
		
		data() {
			return {
				provider:'alipay',// 选择支付方式
				loading:false,   //提交中
				data:{},//订单信息服务接口时作为请求参数
			}
		},
     
		onLoad(option) {
			//#ifdef MP-WEIXIN
			//微信小程序选中微信支付
			this.provider = 'wxpay'
			//#endif
		},
		methods: { 

			//登录微信小程序 获取用户openid
			loginWeixinMp(){
				// 小程序登录流程图
				// https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
				return new Promise( (resolve,reject) =>{
					// 1.先获取用户code   再获取openid
					uni.login({  //这个方法是获取当前的登录类型
						provider:'winxiin',
						success: async (res) => {
							console.log('res',res.code)
						// 第二步.再获取openid 调用后台服务接口
							//let {data:openid }  = await api.getUserOpenid() 
							let openid = 'openid-sadbaksjdbid'  
							// uni.setStorageSync 同步保存在本地
							uni.setStorageSync('openid',openid)
							resolve(openid)
						},
						fail: (error) => {
							reject(error)
						}
					})
				})
			},
			
			//微信小程序支付
			async	wxPayHandler(){
				this.loading = true 
				//1.登录小程序  获取code  再获取openid 
				//如果本地有 说明之前有存储过  openid 
				let openid  =	uni.getStorageSync('openid')
				
				//如果没有则调用方法去请求 loginWeixinMp
				if(!openid){ 
					try{
						openid	  =  await	this.loginWeixinMp()
					}catch(error){
						//抛出异常reject 
						// 出现异常也就是说上面 loginWeixinMp  没有走resolve 
						console.error(error)
					}
					
					// 执行loginWeixinMp 异常的话 重新给按钮一个false
					if(!openid){
						uni.showModal({
							content:'获取openid失败',
							showCancel:false
						})
						//设置false  后让他重新在去获取openid
						this.loading = false
						return
					}
				}
				
				console.log('openid',openid)
				//2.通过openid 调用后台服务接口获取订单信息
				let  orderInfo = await	this.getOrderInfo(openid)
				
				
				//3.发起支付
				uni.requestPayment({
					...orderInfo,  
					//..orderInfo  等同于  下面↓
					// provider: 'wxpay',
					// timeStamp: String(Date.now()),
					// nonceStr: 'A1B2C3D4E5',
					// package: 'prepay_id=wx20180101abcdefg',
					// signType: 'MD5',
					// paySign: '',
					success:(res)=>{
						uni.showToast({
							title:'支付成功！'
						})
						//跳转到订单页面
						
					},
					fail:(error)=>{
						uni.showModal({
							content:'支付失败'+error.message,
							showCancel:false
						})
					},
					complete:()=> {
						this.loading = false
					}
				})
				
			},
			
			// 获取支付渠道
			radioChange(event){
				console.log(event,'event')  
				this.provider = event.detail.value
			},
			
			//安卓端APP支付
			async payHandler(){
				// #ifdef APP-PLUS
					// 注意: orderInfo 是promise 对象 
					// 要里面的resolve 和reject  
					// 就要 在他的方法上面在加一层  async 和await
					
					//支付中
					this.loading = true  //按钮不能在点击了
					
					// 1.获取订单信息
					let orderInfo = await this.getOrderInfo()
					console.log(orderInfo,'res')
					//如果没有订单信息就 获取失败
					if(!orderInfo){   
						unii.showModal({
							content:'获取支付订单信息失败',  
							showCancel:false  //取消按钮隐藏   | 只有一个确认按钮 
						})
						return 
					}
					// 2.发送支付请求
					uni.requestPayment({
						provider:this.provider,  //获取支付渠道 第三方是什么支付的  alipay 还是wxpay  在radioChange 这个方法里
						orderInfo:orderInfo,   //给订单信息
						success:()=>{
							uni.showToast({
								title:'支付成功'
							})
							//跳转到我的订单页面
							this.navTo('pages/order/order')
						},
						fail:(error)=> {
							console.log('支付失败',error)
							uni.showModal({
								content:'支付失败',
								showCancel:false
							})
						},
						complete: () => {
							//按钮设置为false
							this.loading = false
						}
						
					})
				// #endif
				
				
				// #ifdef H5
				
				// #endif
			},
			
			//获取预支付订单信息   支付宝 -微信  接口	  
			getOrderInfo(openid){
				// 注意: async  写在promise 里面
				return  new Promise ( async (resolve,reject)=>{
					
					//这里调用的是微信小程序 - 因为传了openid才会走这里if  走完就resolve  + return 结束了这个方法
					if(openid){
						 
						// 注意你:这里的orderInfo 对象要看文档 : 微信小程序文档
						// https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_2.shtml
						 
						//微信小程序发送请求到服务端获取订单信息
						// 注意: 这里少写了一个接口, orderInfo 是代替接口对象返回数据  
						// await.api.getOrderInfoWxpayMP({openid:openid})
						// orderInfo 的属性可以查看:
						// https://uniapp.dcloud.io/api/plugins/payment.html 
						// 后端响应数据给我们  下面的orderinfo  是模拟数据  
						 let orderInfo =  {
							 timeStamp: "1414561699",
							 nonceStr: "5K8264ILTKCH16CQ2502SI8ZNMTM67VS",
							 package: "prepay_id=wx201410272009395522657a690389285100",
							 signType: "RSA",
							 paySign: "oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ\/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddkGuT+Cdvu4WBqDzaDjnNa5UK3GfE1Wfl2gHxIIY5lLdUgWFts17D4WuolLLkiFZV+JSHMvH7eaLdT9N5GBovBwu5yYKUR7skR8Fu+LozcSqQixnlEZUfyE55feLOQTUYzLmR9pNtPbPsu6WVhbNHMS3Ss2+AehHvz+n64GDmXxbX++IOBvm2olHu3PsOUGRwhudhVf7UcGcunXt8cqNjKNqZLhLw4jq\/xDg==",
						 }
						 resolve(orderInfo)
						 return 
					}
					
					let  res = null   
					// let  data =  {}   //提交给后端的数据 （自行扩展）
					if(this.provider === 'alipay'){
						//注意  ： await 
						//请求接口 -  支付宝
						res = 	await	api.getOrderInfoAlipay(this.data)
					}else if(this.provider === 'wxpay'){
						//请求接口  - 微信
						res =  await  api.getOrderInfoWxpay(this.data)
					}
					 
					//判断返回是否成功数据  | 成功后返回  res.data 否则 响应后端错误message 
					if(res.code === 20000){
						resolve(res.data)
					}else{
						reject(new Error('获取支付信息失败,原因：' + res.message))
					}
				}) 
			}
		}
	}
